//package com.zmn.plat.manager.impl.search;
//
//import com.zmn.plat.manager.dictionary.SpareDict;
//import com.zmn.plat.manager.utils.MqConsts;
//import com.zmn.common.utils.date.DateUtil;
//import com.zmn.common.utils.reflect.CopyObjectUtil;
//import com.zmn.common.utils.string.StringUtil;
//import com.zmn.plat.manager.interfaces.search.SProductRepository;
//import com.zmn.plat.model.dto.SProductDTO;
//import com.zmn.plat.model.dto.MQSProductDTO;
//import com.zmn.plat.model.entity.spare.SProduct;
//import com.zmn.plat.persistence.interfaces.spare.SProductDao;
//import com.zmn.plat.persistence.interfaces.spare.SProductViewDao;
//import org.slf4j.Logger;
//import org.elasticsearch.action.bulk.BulkRequestBuilder;
//import org.elasticsearch.action.bulk.BulkResponse;
//import org.elasticsearch.action.delete.DeleteRequestBuilder;
//import org.elasticsearch.action.delete.DeleteResponse;
//import org.elasticsearch.action.get.GetRequestBuilder;
//import org.elasticsearch.action.index.IndexRequestBuilder;
//import org.elasticsearch.action.index.IndexResponse;
//import org.elasticsearch.action.update.UpdateRequestBuilder;
//import org.elasticsearch.action.update.UpdateResponse;
//import org.elasticsearch.client.transport.TransportClient;
//import org.elasticsearch.common.xcontent.XContentBuilder;
//import org.elasticsearch.script.Script;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * @author nowind
// * @since 17/11/13 16:00
// */
//@Service
////public class SProductRepositoryImpl implements SProductRepository {
//    private Logger logger = LoggerFactory.getLogger(SProductRepositoryImpl.class);
//
//    private final static String PRODUCT_INDEX   = "zmn_plat";     //product所在的索引
//    private final static String PRODUCT_TYPE    = "s_product";    //product对应的类型
//
//    @Autowired
//    private SProductDao productDao;
//    @Autowired
//    private SProductViewDao productViewDao;
//    @Autowired
//    private TransportClient transportClient;
//
//
//    //region 更新SProduct
//    @Override
//    public boolean updateProduct(MQSProductDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE) {
//            return this.updateProduct(mq.getProductId());
//        }
//        return false;
//    }
//    @Override
//    public boolean updateProduct(int productId) {
//
//        try {
//
//            SProduct product = productDao.findByKey(productId);
//            SProductDTO doc = this.initProduct(product);
//
//            //浏览数统计
//            Integer viewCount = productViewDao.findByKey(product.getProductId());
//            doc.setViewCount(viewCount != null ? viewCount : 0);
//
//            XContentBuilder scb = this.buildXContentBuilder(doc);
//            UpdateRequestBuilder urb = this.getUpdateResponse(doc.getProductId());
//            urb.setDocAsUpsert(true);   //不存在则创建
//
//            UpdateResponse response = urb.setDoc(scb).execute().actionGet();
//
//            //logger.info(String.format("[zmn]更新索引sproduct doc成功,productId:[%s],result:[%s]", productId, response.status()));    // //response.status:OK or CREATED(不存在时)
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]更新索引sproduct doc出错,productId:[%s],ex:[%s]", productId, ex.getMessage()));
//            return false;
//        }
//    }
//
//    //region 更新SProduct(批量更新)
//    @Override
//    public boolean updateProduct(List<SProduct> items) {
//
//        try {
//
//            BulkRequestBuilder bulk = transportClient.prepareBulk();
//            //String nowTime = DateUtil.toString(updateTime, DateUtil.FORMAT_DEFAULT);
//
//            for(SProduct product: items) {
//
//                SProductDTO doc = this.initProduct(product);
//
//                //浏览数统计
//                Integer viewCount = productViewDao.findByKey(product.getProductId());
//                doc.setViewCount(viewCount != null ? viewCount : 0);
//
//                XContentBuilder scb = this.buildXContentBuilder(doc);
//                UpdateRequestBuilder urb = this.getUpdateResponse(doc.getProductId());
//                urb.setDocAsUpsert(true);
//
//                urb.setDoc(scb);
//
//                bulk.add(urb);
//            }
//
//            BulkResponse response = bulk.execute().actionGet();
//
//            //logger.info(String.format("[zmn]批量更新索引sproduct doces成功,count:[%s],result:[%s]", items.size(), response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]批量更新索引sproduct doces出错,count:[%s],ex:[%s]", items.size(), ex.getMessage()));
//            return true;
//        }
//    }
//    //endregion
//
//    //endregion
//
//    //region 更新SProduct主图
//    @Override
//    public boolean updateProductImgSrc(MQSProductDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE_IMGSRC) {
//            return this.updateProductImgSrc(mq.getProductId(), mq.getImgSrc(), mq.getUpdateTime());
//        }
//
//        return false;
//    }
//    @Override
//    public boolean updateProductImgSrc(int productId, String imgSrc, Date updateTime) {
//
//        try {
//
//            String nowTime = DateUtil.toString(updateTime, DateUtil.FORMAT_DEFAULT);
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("productId", productId);
//            map.put("imgSrc", imgSrc);
//            map.put("updateTime", nowTime);
//
//            UpdateResponse response = this.getUpdateResponse(productId).setDoc(map).execute().actionGet();
//
//            //logger.info(String.format("[zmn]更新索引sproduct imgSrc成功,productId:[%s],result:[%s]", productId, response.status()));
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]更新索引sproduct imgSrc出错,productId:[%s],ex:[%s]", productId, ex.getMessage()));
//            return false;
//        }
//    }
//    //endregion
//
//    //region 更新SProduct状态
//    @Override
//    public boolean updateProductStatus(MQSProductDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE_STATUS) {
//            return this.updateProductStatus(mq.getProductId(), mq.getStatus(), mq.getUpdateTime());
//        } else if(type == MqConsts.INDEX_TYPE_UPDATE_STATUS_BATCH) {
//            return this.updateProductStatus(StringUtil.convertStrsToList(mq.getProductIds()), mq.getStatus(), mq.getUpdateTime());
//        }
//        return false;
//    }
//    @Override
//    public boolean updateProductStatus(List<Integer> productIds, int status, Date updateTime) {
//
//        try {
//
//            BulkRequestBuilder bulk = transportClient.prepareBulk();
//            String nowTime = DateUtil.toString(updateTime, DateUtil.FORMAT_DEFAULT);
//
//            for (Integer productId : productIds) {
//                Map<String, Object> map = new HashMap<>();
//                map.put("productId", productId);
//                map.put("status", status);
//                map.put("updateTime", nowTime);
//                bulk.add(this.getUpdateResponse(productId).setDoc(map));
//            }
//
//            BulkResponse response = bulk.execute().actionGet();
//
//            //logger.info(String.format("[zmn]批量更新索引sproduct status成功,productIds:[%s],result:[%s]", productIds, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]批量更新索引sproduct status出错,productIds:[%s],ex:[%s]", productIds, ex.getMessage()));
//            return true;
//        }
//    }
//    @Override
//    public boolean updateProductStatus(int productId, int status, Date updateTime) {
//
//        try {
//
//            String nowTime = DateUtil.toString(updateTime, DateUtil.FORMAT_DEFAULT);
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("productId", productId);
//            map.put("status", status);
//            map.put("updateTime", nowTime);
//
//            UpdateResponse response = this.getUpdateResponse(productId).setDoc(map).execute().actionGet();
//
//            //logger.info(String.format("[zmn]更新索引sproduct status成功,productId:[%s],result:[%s]", productId, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//
//            logger.error(String.format("[zmn]更新索引sproduct status出错,productId:[%s],ex:[%s]", productId, ex.getMessage()));
//            return false;
//        }
//    }
//    //endregion
//
//    //region 更新SProduct排序
//    @Override
//    public boolean updateProductSort(MQSProductDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE_SORT) {
//            return this.updateProductSort(mq.getProductId(), mq.getSort());
//        } else if(type == MqConsts.INDEX_TYPE_UPDATE_SORT_BATCH) {
//            return this.updateProductSort(StringUtil.convertStrsToList(mq.getProductIds()), StringUtil.convertStrsToList(mq.getSorts()));
//        }
//        return false;
//    }
//    @Override
//    public boolean updateProductSort(List<Integer> productIds, List<Integer> sorts) {
//
//        try {
//
//            BulkRequestBuilder bulk = transportClient.prepareBulk();
//
//            for(int i=0; i<productIds.size(); i++) {
//                Map<String, Object> map = new HashMap<>();
//                map.put("productId", productIds.get(i));
//                map.put("sort", sorts.get(i));
//                bulk.add(this.getUpdateResponse(productIds.get(i)).setDoc(map));
//            }
//
//            BulkResponse response = bulk.execute().actionGet();
//
//            //logger.info(String.format("[zmn]批量更新索引sproduct sort成功,productIds:[%s],result:[%s]", productIds, response.status()));    //response.status:OK
//
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]批量更新索引sproduct sort出错,productIds:[%s],ex:[%s]", productIds, ex.getMessage()));
//            return true;
//        }
//    }
//    @Override
//    public boolean updateProductSort(int productId, int sort) {
//
//        try {
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("productId", productId);
//            map.put("sort", sort);
//
//            UpdateResponse response = this.getUpdateResponse(productId).setDoc(map).execute().actionGet();
//
//           //logger.info(String.format("[zmn]更新索引sproduct sort成功,productId:[%s],result:[%s]", productId, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]更新索引sproduct sort出错,productId:[%s],ex:[%s]", productId, ex.getMessage()));
//            return false;
//        }
//    }
//    //endregion
//
//    //region 更新SProduct修改时间
//    @Override
//    public boolean updateProductUpdateTime(MQSProductDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE_UPDATETIME) {
//            return this.updateProductUpdateTime(mq.getProductId(), mq.getUpdateTime());
//        }
//        return false;
//    }
//    @Override
//    public boolean updateProductUpdateTime(int productId, Date updateTime) {
//
//        try {
//
//            String nowTime = DateUtil.toString(updateTime, DateUtil.FORMAT_DEFAULT);
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("productId", productId);
//            map.put("updateTime", nowTime);
//
//            UpdateResponse response = this.getUpdateResponse(productId).setDoc(map).execute().actionGet();
//
//            //logger.info(String.format("[zmn]更新索引sproduct updateTime成功,productId:[%s],result:[%s]", productId, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]更新索引sproduct updateTime出错,productId:[%s],ex:[%s]", productId, ex.getMessage()));
//            return false;
//        }
//    }
//    //endregion
//
//
//    //region 创建SProduct
//    @Override
//    public boolean addProduct(MQSProductDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_ADD) {
//            return this.addProduct(mq.getProductId());
//        }
//        return false;
//    }
//    @Override
//    public boolean addProduct(int productId) {
//
//        try {
//
//            SProduct product = productDao.findByKey(productId);
//            SProductDTO doc = this.initProduct(product);
//
//            XContentBuilder scb = this.buildXContentBuilder(doc);
//            IndexRequestBuilder irb = this.getIndexResponse(productId);
//
//            IndexResponse response = irb.setSource(scb).execute().actionGet();
//
//            //logger.info(String.format("[zmn]创建索引sproduct doc成功,productId:[%s],result:[%s]", productId, response.status()));    //response.status:CREATED
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]创建索引sproduct doc出错,productId:[%s],ex:[%s]", productId, ex.getMessage()));
//            return false;
//        }
//    }
//    //endregion
//
//
//    //region 删除SProduct
//    @Override
//    public boolean removeProduct(MQSProductDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_DELETE) {
//            return this.removeProduct(mq.getProductId());
//        } else if(type == MqConsts.INDEX_TYPE_DELETE_BATCH) {
//            return this.removeProduct(StringUtil.convertStrsToList(mq.getProductIds()));
//        }
//        return false;
//    }
//    @Override
//    public boolean removeProduct(List<Integer> productIds) {
//
//        try {
//
//            BulkRequestBuilder bulk = transportClient.prepareBulk();
//
//            for (Integer productId : productIds) {
//                bulk.add(this.getDeletResponse(productId));
//            }
//
//            BulkResponse response = bulk.execute().actionGet();
//
//            //logger.info(String.format("[zmn]批量删除索引sproduct doces成功,productIds:[%s],result:[%s]", productIds, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]批量删除索引sproduct doces出错,productIds:[%s],ex:[%s]", productIds, ex.getMessage()));
//            return true;
//        }
//    }
//    @Override
//    public boolean removeProduct(int productId) {
//
//        try {
//
//            DeleteResponse response = this.getDeletResponse(productId).execute().actionGet();
//
//            //logger.info(String.format("[zmn]删除索引sproduct doc成功,productId:[%s],result:[%s]", productId, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]删除索引sproduct doc出错,productId:[%s],ex:[%s]", productId, ex.getMessage()));  //response.status:NOT_FOUND
//            return false;
//        }
//    }
//    //endregion
//
//
//    //region 更新SProduct浏览数
//
//    @Override
//    public boolean updateProductViewTimes(MQSProductDTO mq) {
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE_VIEW) {
//            return this.updateProductViewTimes(mq.getProductId(), mq.getNumber());
//        }
//        return false;
//    }
//    @Override
//    public boolean updateProductViewTimes(Integer productId, int times) {
//
//        try {
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("productId", productId);
//            map.put("viewCount", times);
//
//            UpdateResponse response = this.getUpdateResponse(productId).setDoc(map).execute().actionGet();
//
//            //logger.info(String.format("[zmn]更新索引sproduct viewCount成功,productId:[%s],result:[%s]", productId, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]更新索引sproduct viewCount出错,productId:[%s],ex:[%s]", productId, ex.getMessage()));
//            return false;
//        }
//    }
//
//    @Override
//    public boolean updateProductViewIncrement(MQSProductDTO mq) {
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE_VIEW_INCR) {
//            return this.updateProductViewIncrement(mq.getProductId(), mq.getNumber());
//        }
//        return false;
//    }
//    @Override
//    public boolean updateProductViewIncrement(Integer productId, int increment) {
//
//        try {
//
//            //增量更新脚本
//            Script script = new Script("ctx._source.viewCount += " + increment);
//
//            //增量更新
//            UpdateRequestBuilder urb = this.getUpdateResponse(productId);
//            urb.setScript(script);
//            UpdateResponse response = urb.execute().actionGet();
//
//            //logger.info(String.format("[zmn]增量更新索引sproduct viewCount成功,productId:[%s],result:[%s]", productId, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]增量更新索引sproduct viewCount出错,productId:[%s],ex:[%s]", productId, ex.getMessage()));
//            return false;
//        }
//    }
//
//    //endregion
//
//
//    //region initSProduct
//    private SProductDTO initProduct(SProduct product) {
//
//        SProductDTO productDTO = new SProductDTO();
//
//        CopyObjectUtil<SProduct, SProductDTO> copyObjectUtil = new CopyObjectUtil<>(product, productDTO);
//        copyObjectUtil.copy();
//
//        if(productDTO.getDeadlineUnit() > 0)
//            productDTO.setDeadlineUnitStr(SpareDict.getDeadlineUnit(product.getDeadlineUnit()));
//        if(productDTO.getPledgeType() > 0)
//            productDTO.setPledgeTypeStr(SpareDict.getPledgeType(product.getPledgeType()));
//        if(productDTO.getCustomerCrowd() > 0)
//            productDTO.setCustomerCrowdStr(SpareDict.getCustomerType(product.getCustomerCrowd()));
//
//        return productDTO;
//    }
//    //endregion
//
//    //region buildXContentBuilder
//
//    /**
//     * 构建XContentBuilder,深度2
//     */
//    public XContentBuilder buildXContentBuilder(SProductDTO doc) {
//        return com.zmn.manager.elastic.utils.SpringDataUtil.buildXContentBuilder(doc.getClass(), doc, 2);
//    }
//
//    //endregion
//
//    //region getResponse
//    private GetRequestBuilder getGetResponse(int productId){
//        return transportClient.prepareGet(PRODUCT_INDEX, PRODUCT_TYPE, String.valueOf(productId));
//    }
//
//    private UpdateRequestBuilder getUpdateResponse(int productId){
//        return transportClient.prepareUpdate(PRODUCT_INDEX, PRODUCT_TYPE, String.valueOf(productId));
//    }
//
//    private IndexRequestBuilder getIndexResponse(int productId){
//        return transportClient.prepareIndex(PRODUCT_INDEX, PRODUCT_TYPE, String.valueOf(productId));
//    }
//
//    private DeleteRequestBuilder getDeletResponse(int productId){
//        return transportClient.prepareDelete(PRODUCT_INDEX, PRODUCT_TYPE, String.valueOf(productId));
//    }
//    //endregion
//}
